/**
 * 给定<Wi,Li>的数组，当选取第i个元素时，
 * 意味着能收获Wi，且接下来Li个元素均不能取。问最大可能的收获
 * 
 * 注意到设Di是到i为止的最大收获，则Di由之前的哪些Dj决定是不好确定的
 * 除非做一个预处理
 * 
 * 因此设Di是以i开头的到结尾能够拿到的最大收获，则
 * Di = max(Wi + D[i+Li+1], D[i + 1])
 * 就对应选和不选两种策略
 */

class Solution {

using llt = long long;
using vi = vector<int>;

int N;
vector<llt> D;

public:
    long long mostPoints(vector<vector<int>>& questions) {
        N = questions.size();
        D.assign(N + 1, 0);
        for(int i=N-1;i>=0;--i){
            auto wi = questions[i][0];
            auto skip = questions[i][1];
            if(i + skip + 1 <= N){
                D[i] = max(D[i + 1], D[i + skip + 1] + wi);
            }else{
                D[i] = max(D[i + 1], (llt)wi);
            }
        }
        return D[0];
    }
};